﻿#pragma once

#include "Common.h"

/*
* 实现CentralCache的基本思路：我们引入Span结构拉管理从PageCache申请的大块内存（以页为单位），CentralCache中使用哈希桶来管理Span，同样的，这里CentralCache桶的划分规则和ThreadCache一致。每一个桶的本质是SpanList(双向带头循环链表)，每一个SpanList中的Span都被划分成了当前桶字节数的小块内存，所以Span中应该有FreeList(用来管理小块内存)。同时需要记录每个Span被划分后的小块内存的数量。
*/

// 单例模式
class CentralCache
{
public:
	static CentralCache* GetInstance()	
	{
		return &_sInst;
	}

	Span* GetOneSpan(SpanList& list, size_t pageNum); // 获得span
	size_t FetchRangeObj(void*& begin, void*& end, size_t batchNum, size_t size);
	void ReleaseListToSpan(void* start, size_t size);

private:
	CentralCache() {}
	CentralCache(const CentralCache&) = delete;
	CentralCache& operator=(const CentralCache&) = delete;

private:
	SpanList _spanLists[NFREE_LISTS];
	static CentralCache _sInst;
};